class Animal
end   #定义Animal这个类

class Dog < Animal
  def initialize(name)
    @name = name   #定义Dog这个类包含在Animal类里面，并初始化Dog的名字，
  end
end

class Cat < Animal
  def initialize(name)
    @name = name  #定义Cat这个类包含在Animal类里面，初始化cat名字
  end
end

class Person
  attr_accessor :pet   #为pet命名，我查的，attr_accessor是为@_name命名的，不知道对不对
  def initialize(name)
    @name = name
    @pet = nil  #这个位置pet的命名为无，什么意思？
  end
end

class Employee < Person   
  def initialize(name, salary)
    super(name)  #查的是返回nil时给定到类的父类，那就是Person?
    @salary = salary
  end
end

class Fish
end
  
class Salmon < Fish
end

class Halibut < Fish
end

rover = Dog.new("Rover")  # 命名为rover的狗
satan = Cat.new("Satan")   #命名为satan的猫
mary = Person.new("Mary")  #名为mary的人
mary.pet = satan  # satan为mary的宠物
frank = Employee.new("Frank", 120000)  #frank 为员工名，工资12000
frank.pet = rover   #rover为frank宠物
flipper = Fish.new   #命名为flipper 的鱼类
crouse = Salmon.new # 命名为crouse的鲑鱼类
harry = Halibut  #命名为harry的大比目鱼类


#关于has-many的关系，在这个里面salmon ,halibut 这两个跟fish的关系就是吧，Fish里面包括多种类型， Person里面也可以分为多种类型，员工，少年，青年等等

#这里<不是包含的关系，而是“继承”的关系，怎么理解这种类型上的继承呢？考虑一下你开始定义了一个Animal类（型），这是一个比较抽象的类型，因为很多东西其他的类型都可以是Animal这个类型，而你后面定义了一个Dog,Cat这些，继承自这个Animal，这些Dog,Cat就要比Animal具体一些了。同时，Dog, Cat都是Animal，而Animal不见得就一定是Dog, Cat，这点好理解吧？
可以考虑你数学上的数的类型，最抽象的数是复数，对吧，然后你可以把实数和纯虚数看成是复数的两个子类，而实数又可以进一步有多个子类，比如有理数，无理数等等，这样，你就可以把这些类型看成一根tree，tree是什么？就是有一个根(root)，还有其他的一些分支和结点的一个“结构”，就类似于英语中的FamilyTree，当然这当中是把一个Family当作一个树的结点。

刚开始，可以考虑把面向对象世界中的类和现实世界中的“类型”联系起来考虑，比如现实世界中有人(Person)，人下面也可以有不通的划分，这个可以根据不同的分类标准来做了，按职业来分的话，可能有医生Doctor，老师Teacher，医生也可以按不同的专业方向进行划分，这里，人就可以是一个比较上层的类，而Doctor, Teacher就是Person的子类了。
你可以以这种思路思考一下你以后做的程序的结构关系。

关于变量，也不是“命名为”，是你定义了一个变量，这个变量的“值”是某个类的实例（这个实例就是一个“物件”，“物体”，object，大陆这边的说法就是一个“对象”），所以rover = Dog.new("Rover")，是在调用Dog这个类的new方法来创建了一个Dog对象（你可以想象，定义Dog时，程序世界里只有狗这个概念，还没有一条真正的狗，只有你这样调用其new方法之后，才会有第一只狗），后面的就是差不多的了，mary.pet = satan，是说把mary这个对象的pet赋值为satan，正如前面据说，定义Person的时候还程序世界里一个人也没有，Person.new的时候，程序世界里有了第一个人，这个人要养个宠物（这个宠物可能是Dog, 也可能是Cat）,给这个对象的pet属性赋值就行了，也就是mary.pet = satan, 这样，mary的pet就是这个satan了
